﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.catalogos;
using System.Text;
using System.IO;
using Negocio;
using Negocio.clases_tontas;

namespace Presentacion.controlasistencia
{
    public partial class justificacion : System.Web.UI.Page
    {
        //objetos
        /// <summary>
        /// catalogo estudiante
        /// </summary>
        catalogoEstudiante _objE = new catalogoEstudiante();
        /// <summary>
        /// catalogo cabecera asistencia
        /// </summary>
        catalogoCabeceraAsistencia _objCA = new catalogoCabeceraAsistencia();
        /// <summary>
        /// catalogo asistencia
        /// </summary>
        catalogoAsistencia _objA = new catalogoAsistencia();
        /// <summary>
        /// catalogo horario
        /// </summary>
        catalogoHorario _objH = new catalogoHorario();
        /// <summary>
        /// catalogo distribucion
        /// </summary>
        catalogoDistribucion _objD = new catalogoDistribucion();
        /// <summary>
        /// catalogo justificacion
        /// </summary>
        catalogoJustificacion _objJ = new catalogoJustificacion();
        /// <summary>
        /// catalogo Calendario Academico
        /// </summary>
        catalogoCalendarioAcademico _objCalendario = new catalogoCalendarioAcademico();
        catalogoCabecera _objC = new catalogoCabecera();
        catalogoCalendarioAcademico _objCa = new catalogoCalendarioAcademico();
        
        StringBuilder cod_html = new StringBuilder();
        StringBuilder cod_html2 = new StringBuilder();
        List<int> list_idAsistencias = new List<int>();
        /// <summary>
        /// Metodo Load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            //string uno = (Session["idDocente"]).ToString();
            //string dos = (Session["CodCarrera"]).ToString();

            if (Session["idDocente"] != null && Session["CodCarrera"] != null)
            {
                if (!IsPostBack)
                {
                       HTML();
                
                    var fechas = _objCalendario.obtenerFechasMatriculas(Convert.ToInt32(Session["periodo"]));
                    DateTime ordinariaInicio = new DateTime();
                    DateTime ordinariaFin = new DateTime();
                    DateTime extraInicio = new DateTime();
                    DateTime extraFin = new DateTime();
                    int contador = 1, ce = 0;
                    foreach (var item in fechas)
                    {
                        if (contador == 2)
                        {
                            extraInicio = Convert.ToDateTime(item.start);
                            extraFin = Convert.ToDateTime(item.end);
                        }
                        if (ce == 0)
                        {
                        
                                ordinariaInicio = Convert.ToDateTime(item.start);
                                ordinariaFin = Convert.ToDateTime(item.end);
                                contador += 1;
                                ce += 1;
                        }
                    }
                    DateAsisInicio.Value = (ordinariaInicio.Day + "/" + ordinariaInicio.Month + "/" + ordinariaInicio.Year); 
                }
                
            }
            else
            {
                Server.Transfer("~/controlasistencia/404.aspx");
            }

        }
        /// <summary>
        /// CARGAR EL HTML DE LA PAGINA
        /// </summary>
        private void HTML() {
            
        }
        #region justificacion
        /// <summary>
        /// para buscar las faltas por fecha y cedula
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            consultarInasistencias();
        }
        private void consultarInasistencias()
        {
            //
            string ced = this.txtCedula.Text.Trim(), fecInicio = this.txtFechaInicio.Value, fecFin = this.txtFechaFin.Value, msm = "Cédula o fechas incorrecta..!!", msm2="Ingrese la cédula";
            if (ced == "")
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm2  + "')", true);
            }
            if (fecInicio == "" || fecFin == "")
            { 
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de llenar todos los datos..!!')", true);
            }
            else
            {
                if ((Convert.ToDateTime(fecInicio) > Convert.ToDateTime(fecFin)))
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('La fecha de inicio (Desde) no puede ser mayor a la fecha final (Hasta)..!!')", true);
                }
                else
                {
                    try
                    {
                        ///tabla de datos de las inasistencias
                        cod_html.Append("<table class='table table-hover table-bordered'>");
                        var cedula = _objE.obtenerEstudianteXCED(ced).First();
                        int id_Estudiante = cedula.Id_Alumno;
                        ///tabla de datos del alumno
                        cod_html2.Append("<table class='table table-striped'>" +
                                "<thead><tr>" +
                               "<th lista-estudiantes-bolder>NOMBRES Y PELLIDOS:</th>" +
                               "</tr>" +
                            "</thead>" +
                            "<tbody>" +
                                "<tr>" +
                                    "<td class='lista-estudiantes'>" + cedula.Nombres + "</tr>" +
                                "<tr>" +
                                    "<th lista-estudiantes-bolder>SEMESTRE:</th>" +
                                "</tr>" +
                                "<tr>" +
                                    "<td class='lista-estudiantes'>" + cedula.Semestre + "</tr>" +
                                "<tr>" +
                                    "<th lista-estudiantes-bolder>CARRERA:</th>" +
                                "</tr>" +
                                "<tr>" +
                                    "<td class='lista-estudiantes'>" + cedula.Carrera + "</tr></tbody>" +
                            "</table>");
                        cod_html.Append("<thead><tr><th>Materia</th><th>Fecha/dias faltados</th><th>Horas</th></tr></thead>");
                        //var cabecera = _objCA.obtenerCabeceraAsistenciaXIDEstudiante(id_Estudiante);
                        var inasistencias = _objA.obtenerAsistenciaxIDCabeceraANDidEstudianteANDFecha(id_Estudiante, fecInicio, fecFin);

                        var resultDistribuciones = inasistencias.GroupBy(C => C.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion).Select(g => g.First()).ToList();
                       
                        //int temporal = 0;

                        if (inasistencias.Count() > 0)
                        {
                            foreach (var itemDistribucion in resultDistribuciones)
                            {
                                //int totalHorasXmaterias = 0;
                                //var resultInasistencia = (inasistencias.Where(E => E.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion == itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion)).GroupBy(C => C.fecha).Select(g => g.First()).ToList();
                                //foreach (var itemDias in resultInasistencia)
                                //{

                                    //foreach (var itemHoras in inasistencias.Where(T => T.fecha == itemDias.fecha && T.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion == itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion))
                                    //{
                                    //    DateTime fecha = DateTime.Now;
                                    //    TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(itemHoras.CabeceraAsistencia.Cabecera.idDetalleHorario.horaEntrada);
                                    //    TimeSpan _intervaloHoraSalida = TimeSpan.Parse(itemHoras.CabeceraAsistencia.Cabecera.idDetalleHorario.horaSalida);

                                    //    DateTime horaEntrada = new DateTime(fecha.Year, fecha.Month, fecha.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                    //    DateTime horaSalida = new DateTime(fecha.Year, fecha.Month, fecha.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);
                                    //    int horaDiaria = 0;
                                    //    horaDiaria = (horaSalida.Subtract(horaEntrada)).Hours;
                                    //    totalHorasXmaterias = totalHorasXmaterias + horaDiaria;
                                    //}

                                    //string itemfecha = item.fecha.ToString();
                                    //string[] split = itemfecha.Split(new Char[] { '/' });
                                    //string[] split2 = split[2].Split(new Char[] { ' ' });
                                    //int contador = 0;
                                    if (tipoJustificacion.Value == "2")
                                    {
                                        //No vale jeje solo para que compares la burrada
                                        //var materia = _objD.obtenerDistribucionId(item2.idDistribucion.idDistribucion);
                                        //if (2 == 1)
                                        //{
                                        //    foreach (var item3 in materia)
                                        //    {
                                        //        cod_html.Append("<tbody><tr><td>" + item3.Nombre + "</td><td>" + split[0] + "/" + split[1] + "/" + split2[0] + "</td><td>" + horaDiaria + "</td></tr></tbody>");
                                        //    }
                                        //}
                                        //else if ((horaDiaria != 1) && (contador == 0))
                                        //{
                                        //    foreach (var item3 in materia)
                                        //    {
                                        //        cod_html.Append("<tbody><tr><td>" + item3.Nombre + "</td><td>" + split[0] + "/" + split[1] + "/" + split2[0] + "</td><td>" + horaDiaria + "</td></tr></tbody>");
                                        //    }
                                        //    contador += 1;
                                        //}

                                        cod_html.Append("<tr><td>" + itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.Nombre + "</td><td>" + itemDistribucion.fecha.ToShortDateString() + "</td><td>" + inasistencias.Where(E => E.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion == itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion).Count() + "</td></tr></tbody>");

                                    }
                                    else
                                    {
                                        DateTime compara = new DateTime();
                                        if (itemDistribucion.fecha.DayOfWeek == DayOfWeek.Thursday || itemDistribucion.fecha.DayOfWeek == DayOfWeek.Friday)
                                        {
                                            compara = itemDistribucion.fecha.AddDays(5);
                                        }
                                        else
                                        {
                                            compara = itemDistribucion.fecha.AddDays(4);
                                        }

                                        if (itemDistribucion.fecha > compara)
                                        {
                                            cod_html.Clear();
                                            cod_html.Append("<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>");
                                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('El tiempo para una justificacion normal ha expirado')", true);
                                        }
                                        else
                                        {

                                            //if (temporal != item2.idDistribucion.idDistribucion)
                                            //{
                                            //    foreach (var item3 in materia)
                                            //    {
                                            //        cod_html.Append("<tbody><tr><td>" + item3.Nombre + "</td><td>" + split[0] + "/" + split[1] + "/" + split2[0] + "</td><td>" + horaDiaria + "</td></tr></tbody>");
                                            //    }
                                            //    temporal = item2.idDistribucion.idDistribucion;
                                            //}
                                            cod_html.Append("<tr><td>" + itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.Nombre + "</td><td>" + itemDistribucion.fecha.ToShortDateString() + "</td><td>" + inasistencias.Where(E => E.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion == itemDistribucion.CabeceraAsistencia.Cabecera.idDetalleHorario.idDistribucion.idDistribucion).Count() + "</td></tr></tbody>");

                                        }
                                    //}
                                }
                            }
                            cod_html.Append("</table><div align='right'><button class='btn btn-green' type='button' onclick='callModal2();'" +
                                                            "data-toggle='modal' data-target='#popup'>Justificar asistencias!</button></div>");
                        }
                        else
                        {
                            cod_html.Clear();
                            cod_html.Append("<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>");
                        }
                    }
                    catch (Exception)
                    {
                        cod_html.Clear();
                        cod_html.Append("");//<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm + "')", true);
                    }
                    datos_alumno.InnerHtml = cod_html2.ToString();
                    datos_faltas.InnerHtml = cod_html.ToString();
                }
            }
                
                   
        }
        protected void Button3_Click(object sender, EventArgs e)
        {
            ClientScript.RegisterStartupScript(GetType(), "jsOcultaPanel", "javascript:callModal()", true);
        }
        /// <summary>
        /// para cargar el archivo de pdf de la jusstificacion y guardar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button2_Click(object sender, EventArgs e)
        {
            string error="Asistencia NO justificada, problema se puede presentar debido a que las fechas no poseen el orden correcto.";
            try
            {
                actualizarFaltas();
                subirArchivo();
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Asistencia justificada correctamente')", true);
            }
            catch (Exception ex)
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('"+error+"/"+ex.Message+"')", true);
                
            }
        }


        /// <summary>
        /// sube el archivo pdf a la ruta especificada
        /// </summary>
        public void subirArchivo()
        {
                //mensajes 
                //var msmOK = "Archivo cargado exitosamente.";
                var msmFall = "Archivo no cargado.";
                var msmTipo = "No se ha cargado ningun archivo, unicamente archivos con extencion (.pdf)  ";
                //para verificar el estado del archivo
                Boolean fileOK = false;
                //para indicar la ruta en la q se guardara
                String path = Server.MapPath("~/controlasistencia/archivo_justificacion/");
                if (Directory.Exists(path))
                {
                    //verifica si el control posee un archivo
                    if (file.HasFile && textObservacion.Value != "")
                    {
                        //obtengo la extension del archivo
                        String fileExtension = Path.GetExtension(file.FileName).ToLower();
                        //declaro las extensiones permitidas
                        String[] allowedExtensions = { ".pdf" };
                        //compruebo el archivo de entre las extensiones permitidas
                        for (int i = 0; i < allowedExtensions.Length; i++)
                        {
                            if (fileExtension == allowedExtensions[i])
                            {
                                fileOK = true;
                            }
                        }
                    }
                    if (fileOK)
                    {
                        try
                        {
                            string nombre_Archivo = Path.GetRandomFileName();
                            //guarda el archivo en la ruta especificada
                            file.PostedFile.SaveAs(path + nombre_Archivo + ".pdf");
                            // envio la ruta en donde se guardara la justificacion en conjunto con la observacion de la misma
                            guardarJustificacion(nombre_Archivo + ".pdf");
                            //ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('"+msmOK+"')", true); 
                        }
                        catch (Exception e)
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmFall + "')", true);
                            throw e;
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmTipo + "')", true);
                    } 
                }
                else
                {
                    Directory.CreateDirectory(path);
                    //verifica si el control posee un archivo
                    if (file.HasFile && textObservacion.Value != "")
                    {
                        //obtengo la extension del archivo
                        String fileExtension = Path.GetExtension(file.FileName).ToLower();
                        //declaro las extensiones permitidas
                        String[] allowedExtensions = { ".pdf" };
                        //compruebo el archivo de entre las extensiones permitidas
                        for (int i = 0; i < allowedExtensions.Length; i++)
                        {
                            if (fileExtension == allowedExtensions[i])
                            {
                                fileOK = true;
                            }
                        }
                    }
                    if (fileOK)
                    {
                        try
                        {
                            string nombre_Archivo = Path.GetRandomFileName();
                            //guarda el archivo en la ruta especificada
                            file.PostedFile.SaveAs(path + nombre_Archivo + ".pdf");
                            // envio la ruta en donde se guardara la justificacion en conjunto con la observacion de la misma
                            guardarJustificacion(nombre_Archivo + ".pdf");
                            //ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('"+msmOK+"')", true); 
                        }
                        catch (Exception e)
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmFall + "')", true);
                            throw e;
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msmTipo + "')", true);
                    }
                }

               
        }
        /// <summary>
        /// Guarda el detalle de la justificacion con los respectivos documentos y observaciones
        /// </summary>
        /// <param name="_path"></param>
        private void guardarJustificacion(string _path)
        {
            try
            {
                foreach (var item in list_idAsistencias)
                {
                    _objJ.insertarJustificacion(Convert.ToInt32(tipoJustificacion.Value), Convert.ToInt32(Session["cedula"]), textObservacion.Value, _path, item, DateTime.Now);
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// guarda los datos de las inasistencias justificadas
        /// </summary>
        private void actualizarFaltas() 
        {
            string ced = this.txtCedula.Text.Trim(), fecInicio = this.txtFechaInicio.Value, fecFin = this.txtFechaFin.Value, msm = "Cédula o fechas incorrecta..!!";
            
            if (ced == "" || fecInicio == null || fecFin==null)
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('"+msm+"')", true);
            }
            if ((Convert.ToDateTime(fecInicio) > Convert.ToDateTime(fecFin)))
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('La fecha de inicio (Desde) no puede ser mayor a la fecha final (Hasta)..!!');", true);
            }
            else
            {
                try
                {
                    if (textObservacion.Value == "" || !file.HasFile)
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de ingresar la observacion de la justificacion');", true);
                    }
                    else
                    {
                        var cedula = _objE.obtenerEstudianteXCED(ced).First();
                        int id_Estudiante = cedula.Id_Alumno;
                        var inasistencias = _objA.obtenerAsistenciaxIDCabeceraANDidEstudianteANDFecha(id_Estudiante, fecInicio, fecFin);
                        if (inasistencias.Count() > 0)
                        {
                            foreach (var item in inasistencias)
                            {
                                list_idAsistencias.Add(item.idAsistencia);
                                //el 2 es por el tipo de asistencias de la tabla de tipo de asistencias
                                _objA.modificarAsistenciaXIdAsistencia(Convert.ToInt32(item.idAsistencia), 2, 211046);
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error en el servidor')", true);

                }
            }
        }
        #endregion

        #region asistencias extraordinarias
        protected void btnBuscarAsis_Click(object sender, EventArgs e)
        {
            tablaExtraordinaria();
        }
        public void tablaExtraordinaria()
        {
            //
            string ced = this.textCedulaAsis.Text, fecInicio = this.DateAsisInicio.Value, fecFin = this.DateAsisFin.Value, msm = "Cédula o fechas incorrecta..!!", msm2 = "Ingrese la cédula";
            if (ced == "")
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm2 + "')", true);
            }
            if (fecInicio == "" || fecFin == "")
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de llenar todos los datos..!!')", true);
            }
            else
            {
                if ((Convert.ToDateTime(fecInicio) > Convert.ToDateTime(fecFin)))
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('La fecha de inicio (Desde) no puede ser mayor a la fecha final (Hasta)..!!')", true);
                }
                else
                {
                    try
                    {
                        ///tabla de datos de las inasistencias
                        cod_html.Append("<table class='table table-hover table-bordered'>");
                        var cedula = _objE.obtenerEstudianteXCED(ced).First();
                        int id_Estudiante = cedula.Id_Alumno;
                        ///tabla de datos del alumno
                        cod_html2.Append("<table class='table table-striped'>" +
                                "<thead><tr>" +
                               "<th lista-estudiantes-bolder>NOMBRES Y PELLIDOS:</th>" +
                               "</tr>" +
                            "</thead>" +
                            "<tbody>" +
                                "<tr>" +
                                    "<td class='lista-estudiantes'>" + cedula.Nombres + "</tr>" +
                                "<tr>" +
                                    "<th lista-estudiantes-bolder>SEMESTRE:</th>" +
                                "</tr>" +
                                "<tr>" +
                                    "<td class='lista-estudiantes'>" + cedula.Semestre + "</tr>" +
                                "<tr>" +
                                    "<th lista-estudiantes-bolder>CARRERA:</th>" +
                                "</tr>" +
                                "<tr>" +
                                    "<td class='lista-estudiantes'>" + cedula.Carrera + "</tr></tbody>" +
                            "</table>");
                        cod_html.Append("<thead><tr><th>#</th><th>Materia</th></tr></thead>");
                        //var cabecera = _objCA.obtenerCabeceraAsistenciaXIDEstudiante(id_Estudiante);
                        var materias = _objD.obtenerDistribucionXidAlumno(id_Estudiante, Convert.ToInt32(Session["periodo"]));
                        int contador = 1;
                        foreach (var item in materias)
                        {
                           cod_html.Append("<tbody><tr><td>" + contador + "</td><td>" +  item.Nombre  + "</td></tr></tbody>");
                           contador += 1;
                        }
                        cod_html.Append("</table><div align='right'><a href='#' id='ho' class='btn btn-green borrar' data-toggle='confirmation2' ><i class='icon-white fa fa-plus'></i>Agregar asistencias</a></div>");
                    }
                    catch (Exception)
                    {
                        cod_html.Clear();
                        cod_html.Append("");//<table class='table table-hover table-bordered'><thead><tr><th>No posee inasistencias</th></tr></thead></table>
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('" + msm + "')", true);
                    }
                    datos_alumno2.InnerHtml = cod_html2.ToString();
                    tablaMaterias.InnerHtml = cod_html.ToString();
                }
            }
                
        } 
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            asistencia();
        }
        public void asistencia()
        {
            DateTime fechaFin = new DateTime();
            int cedula = 0;
            if (DateAsisFin.Value != "" && DateAsisInicio.Value != "")
            {
               
                fechaFin = Convert.ToDateTime(DateAsisFin.Value);
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de ingresar todos los datos.');", true);
            }
            if (textCedulaAsis.Text != "")
            {
                cedula = Convert.ToInt32(textCedulaAsis.Text);
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de ingresar todos los datos.');", true);
            }
            var fechas = _objCalendario.obtenerFechasMatriculas(Convert.ToInt32(Session["periodo"]));
            DateTime ordinariaInicio = new DateTime();
            DateTime ordinariaFin = new DateTime();
            DateTime extraInicio = new DateTime();
            DateTime extraFin = new DateTime();
            int contador = 1, ce = 0;
            foreach (var item in fechas)
            {
                if (contador == 2)
                {
                    extraInicio = Convert.ToDateTime(item.start);
                    extraFin = Convert.ToDateTime(item.end);
                }
                if (ce == 0)
                {
                    
                        ordinariaInicio = Convert.ToDateTime(item.start);
                        ordinariaFin = Convert.ToDateTime(item.end);
                        contador += 1;
                        ce += 1;
                }
            }
            string ced = textCedulaAsis.Text;
            if (fechaFin>ordinariaInicio)
            {
                if (fechaFin>extraFin)
                {

                    var cedulaAsis = _objE.obtenerEstudianteXCED(ced).First();
                    int id_Estudiante = cedulaAsis.Id_Alumno;
                    int diasRestantes = fechaFin.Subtract(extraFin).Days;
                    string mensaje=comprobarAsistencia(cedulaAsis.Semestre,ordinariaInicio.ToString(), extraFin.ToString(),"observacion",id_Estudiante,diasRestantes);
                    if (mensaje=="OK")
                    {
                        ClientScript.RegisterStartupScript(GetType(),"jsMensaje","javascript:sucessMesage('Asistencias ingresadas correctamente.');",true);
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMesage('Error al ingresar las asistencias.');", true);
                    }
                }
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Debe de ingresar una fecha de inicio mayor a la del inicio del periodo de matricula');", true);    
            }
        }
        /// <summary>
        /// Comprueba la asistencia
        /// </summary>
        /// <param name="_semestre">filtro</param>
        /// <param name="_desde">filtro</param>
        /// <param name="_hasta">filtro</param>
        /// <param name="_observacion">parametro</param>
        /// <returns></returns>
        public  string comprobarAsistencia(int _semestre, string _desde, string _hasta, string _observacion,int Id_Alumno,int _diasRestantes)
        {
            string hdfCabeceraActual;
            string mensaje = "";
            int diasMes = 0;
            //fechas
            DateTime fechActual = DateTime.Now.Date;

            if (_desde != "" && _hasta != "" && _observacion != "")
            {
                DateTime fechaDesde = Convert.ToDateTime(_desde).Date;
                DateTime fechaHasta = Convert.ToDateTime(_hasta).Date;
                if (fechaDesde > fechaHasta)
                {
                    return "Ingresar las fechas de manera correcta";
                }
                else if (HttpContext.Current.Session["CodCarrera"] != null && _desde != "" && _hasta != "" && _observacion != "")
                {
                    //// los dias q no ha tenido asistencia
                    int dias = fechaHasta.Subtract(fechaDesde).Days;
                    try
                    {  
                        List<distribucion> distribuciones = null;
                            if (_semestre != 0)
                            {
                                distribuciones = _objD.obtenerDistribucionXidAlumno(Id_Alumno, Convert.ToInt32(Session["periodo"]));
                            }
                        for (int i = 0; i < dias + 1; i++)
                        {
                            //aumenta el dia cuando son varios
                            diasMes = DateTime.DaysInMonth(fechaDesde.Year, fechaDesde.Month);
                            DateTime nuevaFecha = fechaDesde.AddDays(i);

                            foreach (var item in distribuciones)
                            {
                                //Horario Actual
                                var consultaHorario = _objH.obtenerHorarioXidPeriodoANDidDistribucion(Convert.ToInt32(HttpContext.Current.Session["periodo"]), Convert.ToInt32(item.idDistribucion));
                                var resultFiltroHorario = (from itemHorario in consultaHorario where itemHorario.detalle == nuevaFecha.DayOfWeek.ToString() select itemHorario);

                                if (resultFiltroHorario.Count() != 0)
                                {
                                    //Lista de cabecera
                                    var resultCabecera = _objC.obtenerCabeceraXIdDistribucionANDidPerido(item.idDistribucion, Convert.ToInt32(HttpContext.Current.Session["periodo"]));
                                    int contadorCabecera = (from itemCabecera in resultCabecera where itemCabecera.fechaCabecera.Date == nuevaFecha select itemCabecera).Count();
                                    //busqueda de la cabecera guardada
                                    if (contadorCabecera == 0)
                                    {
                                        //pregunto por las fechas de los eventos
                                        var resultCalendario = _objCa.obtenerCalendarioAcademicoxPeriodo(Convert.ToInt32(HttpContext.Current.Session["periodo"])).Where(R => R.start.Value.Date == nuevaFecha);
                                        if (resultCalendario.Count() != 0)
                                        {
                                            return "Evento";
                                        }
                                        if (resultCalendario.Count() == 0 && nuevaFecha.DayOfWeek != DayOfWeek.Saturday && nuevaFecha.DayOfWeek != DayOfWeek.Sunday)
                                        {
                                            //Ingreso de las cabeceraAsistencia con los id de los estudiantes
                                            // 211049 sistema
                                            var idCabecera = _objC.insertarCabecera(new cabecera(0, resultFiltroHorario.First(), nuevaFecha, false, 211049));
                                            if (idCabecera != 0)
                                            {
                                                hdfCabeceraActual = idCabecera.ToString();
                                                mensaje = confirmarAsistencia(item.idDistribucion, hdfCabeceraActual, nuevaFecha, _observacion, Id_Alumno, 0);
                                            }

                                        }//end if
                                    }
                                }
                            }//end foreach
                        }

                        for (int i = 1; i < _diasRestantes+1; i++)
                        {
                            //aumenta el dia cuando son varios
                            diasMes = DateTime.DaysInMonth(fechaDesde.Year, fechaDesde.Month);
                            DateTime nuevaFecha = fechaHasta.AddDays(i);

                            foreach (var item in distribuciones)
                            {
                                //Horario Actual
                                var consultaHorario = _objH.obtenerHorarioXidPeriodoANDidDistribucion(Convert.ToInt32(HttpContext.Current.Session["periodo"]), Convert.ToInt32(item.idDistribucion));
                                var resultFiltroHorario = (from itemHorario in consultaHorario where itemHorario.detalle == nuevaFecha.DayOfWeek.ToString() select itemHorario);

                                if (resultFiltroHorario.Count() != 0)
                                {
                                    //Lista de cabecera
                                    var resultCabecera = _objC.obtenerCabeceraXIdDistribucionANDidPerido(item.idDistribucion, Convert.ToInt32(HttpContext.Current.Session["periodo"]));
                                    int contadorCabecera = (from itemCabecera in resultCabecera where itemCabecera.fechaCabecera.Date == nuevaFecha select itemCabecera).Count();
                                    //busqueda de la cabecera guardada
                                    if (contadorCabecera == 0)
                                    {
                                        //pregunto por las fechas de los eventos
                                        var resultCalendario = _objCa.obtenerCalendarioAcademicoxPeriodo(Convert.ToInt32(HttpContext.Current.Session["periodo"])).Where(R => R.start.Value.Date == nuevaFecha);
                                        if (resultCalendario.Count() != 0)
                                        {
                                            return "Evento";
                                        }
                                        if (resultCalendario.Count() == 0 && nuevaFecha.DayOfWeek != DayOfWeek.Saturday && nuevaFecha.DayOfWeek != DayOfWeek.Sunday)
                                        {
                                            //Ingreso de las cabeceraAsistencia con los id de los estudiantes

                                            var idCabecera = _objC.insertarCabecera(new cabecera(0, resultFiltroHorario.First(), nuevaFecha, false, 211049));
                                            if (idCabecera != 0)
                                            {
                                                hdfCabeceraActual = idCabecera.ToString();
                                                mensaje = confirmarAsistencia(item.idDistribucion, hdfCabeceraActual, nuevaFecha, _observacion, Id_Alumno, _diasRestantes);
                                            }

                                        }//end if
                                    }
                                }
                            }//end foreach 
                        }
                    }
                    catch (Exception)
                    {
                        return "Error";
                    }
                    //end for
                    if (mensaje == "OK")
                    {
                        return "OK";
                    }
                    else
                    {
                        return "Error";
                    }
                }
                else
                {
                    return "Error";
                }
            }
            else
            {
                return "Error";
            }
        }
        /// <summary>
        /// Ingresa la asistencia
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_idCabecera">filtro</param>
        /// <param name="_nuevaFecha">filtro</param>
        /// <param name="_observacion">parametro</param>
        public string confirmarAsistencia(int _codDistribucion, string _idCabecera, DateTime _nuevaFecha, string _observacion, int Id_Alumno, int _diasRestantes)
        {

            //variables
            var idCabeceraAsistencia = 0;
            int nroHoraDistribucion = 0;
            var listadoCabecera = _objCA.obtenerCabeceraAsistenciaXIDCabecera(Convert.ToInt32(_idCabecera));
            try
            {
                var cabeceraAsistencia = _objCA.obtenerCabeceraAsistenciaXIDCabeceraANDIDEstudiante(Convert.ToInt32(_idCabecera), Id_Alumno);

                if (cabeceraAsistencia == null)
                {
                    idCabeceraAsistencia = _objCA.insertarCabecetaAsistencia(new cabeceraAsistencia
                        {
                            idEstudiante = Id_Alumno,
                            idCabecera = Convert.ToInt32(_idCabecera),
                            idObservacion = 211046
                        });

                    if (idCabeceraAsistencia != 0)
                    {
                        nroHoraDistribucion = _objH.obtenerNroHoraHorarioXDIa(Convert.ToInt32(HttpContext.Current.Session["periodo"]), _codDistribucion, _nuevaFecha);
                        for (int i = 0; i < nroHoraDistribucion; i++)
                        {

                            if (_diasRestantes != 0)
                            {
                                ///el "3" es por el tipo de asistencia 3="F" en la tabla de tipo asistencia
                                _objA.ingresarAsistencia2(_nuevaFecha, 3, idCabeceraAsistencia, _observacion);
                            }
                            else
                            {
                                ///el "1" es por el tipo de asistencia 1="A" en la tabla de tipo asistencia
                                _objA.ingresarAsistencia2(_nuevaFecha, 1, idCabeceraAsistencia, _observacion);
                            }
                        }
                    }
                }
                return "OK";
            }
            catch (Exception)
            {
                return "Error";
            }
            }
         #endregion
    }   
}

